{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from tensorflow import keras\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data = keras.datasets.imdb\n",
    "max_word = 10000"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "引入预训练词向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "word_index = data.get_word_index()\n",
    "embeddings_index = {}\n",
    "f = open('./glove.6B.100d.txt', encoding=\"utf-8\")\n",
    "for line in f:\n",
    "    values = line.split()\n",
    "    word = values[0]\n",
    "    coefs = np.asarray(values[1:], dtype='float32')\n",
    "    embeddings_index[word] = coefs\n",
    "f.close()\n",
    "embedding_matrix = np.zeros((max_word+1, 100))\n",
    "for word, i in word_index.items():\n",
    "    if i >= max_word:  \n",
    "        continue\n",
    "    embedding_vector = embeddings_index.get(word)  # 根据词向量字典获取该单词对应的词向量\n",
    "    if embedding_vector is not None:\n",
    "        embedding_matrix[i] = embedding_vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "(x_train,y_train),(x_test,y_test)=data.load_data(num_words=max_word)\n",
    "x_train = keras.preprocessing.sequence.pad_sequences(x_train,300)\n",
    "x_test = keras.preprocessing.sequence.pad_sequences(x_test,300)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "单独的词嵌入，查看是否归一化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "model = keras.Sequential()\n",
    "model.add(keras.layers.Embedding(max_word,100,input_length=300))\n",
    "w2v_output = model.predict(x_train)\n",
    "w2v_output"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用预训练词向量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "model.add(keras.layers.Embedding(max_word,100,weights=[embedding_matrix],input_length=300))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "全连接"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model = keras.Sequential()\n",
    "model.add(keras.layers.Embedding(max_word,100,input_length=300))\n",
    "model.add(keras.layers.Flatten())\n",
    "model.add(keras.layers.Dense(16,activation='relu'))\n",
    "model.add(keras.layers.Dropout(0.5))\n",
    "model.add(keras.layers.Dense(16,activation='relu'))\n",
    "model.add(keras.layers.Dropout(0.5))\n",
    "model.add(keras.layers.Dense(16,activation='relu'))\n",
    "model.add(keras.layers.Dropout(0.5))\n",
    "model.add(keras.layers.Dense(1,activation='sigmoid'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "普通CNN"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "model = keras.Sequential()\n",
    "model.add(keras.layers.Embedding(max_word,100,input_length=300))\n",
    "#model.add(keras.layers.Embedding(max_word,100,embeddings_initializer=keras.initializers.Constant(embedding_matrix),input_length=300))\n",
    "model.add(keras.layers.Conv1D(32,5,activation='relu'))\n",
    "model.add(keras.layers.MaxPool1D())\n",
    "model.add(keras.layers.Conv1D(32,4,activation='relu'))\n",
    "model.add(keras.layers.MaxPool1D())\n",
    "model.add(keras.layers.Conv1D(32,3,activation='relu'))\n",
    "model.add(keras.layers.MaxPool1D())\n",
    "model.add(keras.layers.GlobalAveragePooling1D())\n",
    "model.add(keras.layers.Dropout(0.5))\n",
    "model.add(keras.layers.Dense(1,activation='sigmoid'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LSTM"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "model = keras.Sequential()\n",
    "model.add(keras.layers.Embedding(max_word,100,input_length=300))\n",
    "model.add(keras.layers.LSTM(128))\n",
    "model.add(keras.layers.Dropout(0.5))\n",
    "model.add(keras.layers.Dense(1,activation='sigmoid'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "textCNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "main_input = keras.Input(shape=(300,))\n",
    "embedder = keras.layers.Embedding(max_word+1,100,input_length=300)\n",
    "#embedder = keras.layers.Embedding(max_word,100,embeddings_initializer=keras.initializers.Constant(embedding_matrix),input_length=300,trainable=False)\n",
    "embed = embedder(main_input)\n",
    "cnn1 = keras.layers.Conv1D(32, 3, padding='same', strides=1, activation='relu')(embed)\n",
    "cnn1 = keras.layers.MaxPool1D()(cnn1)\n",
    "cnn2 = keras.layers.Conv1D(32, 4, padding='same',strides=1, activation='relu')(embed)\n",
    "cnn2 = keras.layers.MaxPool1D()(cnn2)\n",
    "cnn3 = keras.layers.Conv1D(32, 5, padding='same',strides=1, activation='relu')(embed)\n",
    "cnn3 = keras.layers.MaxPool1D()(cnn3)\n",
    "cnn = keras.layers.concatenate([cnn1,cnn2,cnn3],axis=-1)\n",
    "#cnn = keras.layers.Flatten()(cnn)\n",
    "cnn = keras.layers.GlobalAveragePooling1D()(cnn)\n",
    "drop =keras.layers.Dropout(0.5)(cnn)\n",
    "#bn = keras.layers.BatchNormalization()(cnn)\n",
    "main_output = keras.layers.Dense(1, activation='sigmoid')(drop)\n",
    "model = keras.Model(inputs=main_input, outputs=main_output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "keras.utils.plot_model(model=model,show_shapes=True,show_layer_names=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_4 (InputLayer)            (None, 300)          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "embedding_3 (Embedding)         (None, 300, 100)     1000100     input_4[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_9 (Conv1D)               (None, 300, 32)      9632        embedding_3[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_10 (Conv1D)              (None, 300, 32)      12832       embedding_3[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_11 (Conv1D)              (None, 300, 32)      16032       embedding_3[0][0]                \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling1d_9 (MaxPooling1D)  (None, 150, 32)      0           conv1d_9[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling1d_10 (MaxPooling1D) (None, 150, 32)      0           conv1d_10[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling1d_11 (MaxPooling1D) (None, 150, 32)      0           conv1d_11[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_3 (Concatenate)     (None, 150, 96)      0           max_pooling1d_9[0][0]            \n",
      "                                                                 max_pooling1d_10[0][0]           \n",
      "                                                                 max_pooling1d_11[0][0]           \n",
      "__________________________________________________________________________________________________\n",
      "global_average_pooling1d_2 (Glo (None, 96)           0           concatenate_3[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "dropout_2 (Dropout)             (None, 96)           0           global_average_pooling1d_2[0][0] \n",
      "__________________________________________________________________________________________________\n",
      "dense_2 (Dense)                 (None, 1)            97          dropout_2[0][0]                  \n",
      "==================================================================================================\n",
      "Total params: 1,038,693\n",
      "Trainable params: 1,038,693\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.compile(optimizer=keras.optimizers.RMSprop(lr=0.0001),loss='binary_crossentropy',metrics=['acc'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 25000 samples, validate on 25000 samples\n",
      "Epoch 1/35\n",
      "25000/25000 [==============================] - 10s 409us/step - loss: 0.2103 - acc: 0.9228 - val_loss: 0.2711 - val_acc: 0.8906\n",
      "Epoch 2/35\n",
      "25000/25000 [==============================] - 10s 406us/step - loss: 0.2059 - acc: 0.9231 - val_loss: 0.2712 - val_acc: 0.8902\n",
      "Epoch 3/35\n",
      "25000/25000 [==============================] - 10s 404us/step - loss: 0.2064 - acc: 0.9242 - val_loss: 0.2711 - val_acc: 0.8902\n",
      "Epoch 4/35\n",
      "25000/25000 [==============================] - 10s 405us/step - loss: 0.2018 - acc: 0.9258 - val_loss: 0.2718 - val_acc: 0.8903\n",
      "Epoch 5/35\n",
      " 9072/25000 [=========>....................] - ETA: 4s - loss: 0.2001 - acc: 0.9281"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-16-e060aeea1483>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mhistory\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_train\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m216\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mepochs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m35\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mvalidation_data\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_test\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my_test\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32mE:\\Anacona3\\envs\\kr\\lib\\site-packages\\tensorflow\\python\\keras\\engine\\training.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, max_queue_size, workers, use_multiprocessing, **kwargs)\u001b[0m\n\u001b[0;32m   1637\u001b[0m           \u001b[0minitial_epoch\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1638\u001b[0m           \u001b[0msteps_per_epoch\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1639\u001b[1;33m           validation_steps=validation_steps)\n\u001b[0m\u001b[0;32m   1640\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1641\u001b[0m   def evaluate(self,\n",
      "\u001b[1;32mE:\\Anacona3\\envs\\kr\\lib\\site-packages\\tensorflow\\python\\keras\\engine\\training_arrays.py\u001b[0m in \u001b[0;36mfit_loop\u001b[1;34m(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[0;32m    213\u001b[0m           \u001b[0mins_batch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    214\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 215\u001b[1;33m         \u001b[0mouts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    216\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    217\u001b[0m           \u001b[0mouts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mouts\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mE:\\Anacona3\\envs\\kr\\lib\\site-packages\\tensorflow\\python\\keras\\backend.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, inputs)\u001b[0m\n\u001b[0;32m   2984\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2985\u001b[0m     fetched = self._callable_fn(*array_vals,\n\u001b[1;32m-> 2986\u001b[1;33m                                 run_metadata=self.run_metadata)\n\u001b[0m\u001b[0;32m   2987\u001b[0m     \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_call_fetch_callbacks\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfetched\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_fetches\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2988\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mfetched\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mE:\\Anacona3\\envs\\kr\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m   1437\u001b[0m           ret = tf_session.TF_SessionRunCallable(\n\u001b[0;32m   1438\u001b[0m               \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_handle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1439\u001b[1;33m               run_metadata_ptr)\n\u001b[0m\u001b[0;32m   1440\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1441\u001b[0m           \u001b[0mproto_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train,y_train,batch_size=216,epochs=35,validation_data=(x_test,y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'embedding/embedding_lookup/Identity_2:0' shape=(?, 300, 100) dtype=float32>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.layers[1].output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1c51f47dda0>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c519f5ddd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.epoch,history.history.get('loss'),c=\"r\",label=\"loss\")\n",
    "plt.plot(history.epoch,history.history.get('val_loss'),c=\"b\",label=\"val_loss\")\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25000/25000 [==============================] - 3s 140us/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.27118838769912718, 0.89115999999999995]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test,y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "查找字典中词汇对应数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x_try = np.zeros((1,300))\n",
    "a=np.empty(300); \n",
    "a.fill(37)\n",
    "x_try[0] = a\n",
    "model.predict(x_try)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:kr]",
   "language": "python",
   "name": "conda-env-kr-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
